package main

import "fmt"

type Person struct {
	name string
	age  int
}

type Sporter interface {
	run() //只有生命，没有实现，具体实现看具体的类型
	jump()
}

func (*Person) run() {
	fmt.Println("Run~~~~~")
}

func (*Person) jump() {
	fmt.Println("Jump~~~~~")
}

func (*Person) swim() {
	fmt.Println("Swim~~~~~")
}

type T struct{}

func (*T) run() {
	fmt.Println("T Run~~~~~")
}

func (*T) jump() {
	fmt.Println("T Jump~~~~~")
}

func main() {
	a := new(Person) // Person实现该接口，因为它实现了该接口所有方法
	a.run()

	var s Sporter // s 是什么？go会分配零值
	fmt.Println(s, s == nil)
	fmt.Printf("%T\n", s)
	s = a // 接口是规范，它的变量应该对应符合该接口的实例或实例的指针
	// a 是 Person 类型的，此例中准确的说是*Persion
	// 由于*Person实现了 Sproter接口的所有方法, *Person实现了 Sproter接口
	// a 是 Persion 的实例的指针，a 既是 Person类型的，也是 Sporter 类型的
	s.run()
	a.jump()
	s.jump()

	t := &T{}
	t.run()
	t.jump()
	s = t
	s.run()
	s.jump()
}
